;; SCHEME MACRO SHAPES
(define (unquote? exp)
  (and (pair? exp)
       (eq? 'unquote (car exp))
       (pair? (cdr exp))
       (null? (cddr exp))))
(define (unquote-get-data exp) (cadr exp))
(define (cond/0? exp)
  (and (pair? exp) (eq? 'cond (car exp)) (null? (cdr exp))))
(define (cond/else? exp)
  (and (pair? exp)
       (eq? 'cond (car exp))
       (pair? (cdr exp))
       (pair? (cadr exp))
       (eq? 'else (caadr exp))
       (null? (cddr exp))))
(define (cond/else-get-else exp) (cdadr exp))
(define (cond/1? exp)
  (and (pair? exp)
       (eq? 'cond (car exp))
       (pair? (cdr exp))
       (pair? (cadr exp))
       (null? (cdadr exp))))
(define (cond/1-get-one exp) (caadr exp))
(define (cond/1-get-next exp) (cddr exp))
(define (cond/=>? exp)
  (and (pair? exp)
       (eq? 'cond (car exp))
       (pair? (cdr exp))
       (pair? (cadr exp))
       (pair? (cdadr exp))
       (eq? '=> (cadadr exp))
       (pair? (cddadr exp))
       (null? (cdddr (cadr exp)))))
(define (cond/=>-get-test exp) (caadr exp))
(define (cond/=>-get-thunk exp) (caddr (cadr exp)))
(define (cond/=>-get-next exp) (cddr exp))
(define (cond/clause? exp)
  (and (pair? exp)
       (eq? 'cond (car exp))
       (pair? (cdr exp))
       (pair? (cadr exp))))
(define (cond/clause-get-test exp) (caadr exp))
(define (cond/clause-get-rest exp) (cdadr exp))
(define (cond/clause-get-next exp) (cddr exp))
